linux当路由器
系统参数设置
进入/etc/sysctl.d/,我们设置一些参数,比如转发之类的,还有ipv6的设定。
vim /etc/sysctl.d/99-ip-forward.conf
#ipv4转发
net.ipv4.ip_forward=1
# IPv6转发和相关网络配置
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.eth0.accept_ra=2 #这里是你的wan口
net.ipv6.conf.br-lan.accept_ra=0
# 允许路由通告转发
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.default.proxy_ndp=1
# 禁用IPv6隐私扩展(可选)
net.ipv6.conf.all.use_tempaddr=0
net.ipv6.conf.default.use_tempaddr=0
#bbr配置
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
systemd-networkd配置
由于Arch自带systemd-network,我也就不用其他的了,装完Arch后,我们先确认下自己的网口是哪些:
ip a
这里我的网口是eth0 eth1 eth2 eth3
,共四个
进入到/etc/systemd/network/
目录下
cd /etc/systemd/network
创建一个wan
口的DHCP配置文件(这里我的wan口为DHCP,获取光猫分配的ip)
vim 10-wan.network
[Match]
Name=eth0 #修改成你自己的wan口
[Network]
DHCP=yes
IPv6AcceptRA=yes
[DHCPv6]
UseDelegatedPrefix=yes
[IPv6AcceptRA]
DHCPv6Client=always
:wq
保存退出后,这里我将其他三个网口用作lan
,这里我们用br-lan
将三个网口桥接在一起,方便配置:
vim 15-br-lan.netdev
[NetDev]
Name=br-lan
Kind=bridge
接着我们将新建的br-lan
这个网口和其他三个连接在一起:
vim 20-lan-slaves.network
[Match]
Name=eth1 eth2 eth3 #修改成你自己的lan口
[Network]
Bridge=br-lan
最后就可以配置lan
口了,这里我DHCP服务器也用systemd-network
,lan
口地址为10.100.100.1/24
:
vim 25-br-lan-address.network
[Match]
Name=br-lan
[Link]
Multicast=yes
[Network]
Address=10.100.100.1/24
DHCPServer=yes
MulticastDNS=yes
IPv6SendRA=yes
IPv6AcceptRA=no
DHCPPrefixDelegation=yes
[DHCPServer]
PoolOffset=10
PoolSize=200
DefaultLeaseTimeSec=86400
EmitDNS=yes
DNS=_self
EmitRouter=yes
[DHCPPrefixDelegation]
UplinkInterface=eth0 #修改成你自己的wan口
SubnetId=0x1
Assign=yes
[IPv6SendRA]
Managed=no
OtherInformation=yes
EmitDNS=yes
DNS=_link_local
DNSLifetimeSec=3600
启动systemd-network
并设为开机自启:
systemctl enable --now systemd-networkd
这时候执行ip a
应该就可以发现,你的wan
口和br-lan
口都工作正常,也应该能获得上级路由器分配的IPV6地址
nftables配置
这里我就用Nftables了,也够折腾的。 先安装nftables:
pacman -S nftables
安装完成后 ,修改nftables配置文件:
vim /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set trusted_interfaces {
type ifname
elements = { "br-lan", "lo"}
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iifname @trusted_interfaces accept
meta l4proto { icmp, icmpv6 } accept
# 允许DHCPv6通信
udp dport 546 accept
udp sport 547 accept
}
chain forward {
type filter hook forward priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iifname "br-lan" oifname "eth0" accept
ip6 nexthdr icmpv6 accept
ip6 nexthdr udp udp dport 546 accept
ip6 nexthdr udp udp sport 547 accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat;
oifname "eth0" masquerade
}
}
include "/etc/nftables.d/*.conf"
这里我在末尾添加了一段include "/etc/nftables.d/*.conf"
,以后有啥新增的直接放在那里去,不用动主配置文件。
要注意将配置文件中的eth0
修改成你自己的wan
口
启动nftables并设为开机自启:
systemctl enable --now nftables
DNS服务器
这里我用dnsmasq
了,其实也可以用AdguardHome
,只要监听53
端口就行了:
pacman -S dnsmasq
修改配置文件:
vim /etc/dnsmasq.conf
interface=br-lan
bind-interfaces
port=53
no-resolv
server=223.5.5.5#53
这里将DNS请求转发到阿里DNS上面去了,可以根据你自己喜欢修改, 或者直接上AdguardHome
启动并设为开机自启
systemctl enable --now dnsmasq